home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / svrflsel.c < prev    next >
Text File  |  1996-05-27  |  12KB  |  538 lines

  1. /*
  2.  * SvrFlSel.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * S‚lecteur de fichiers
  7.  *
  8.  * History:
  9.  * --------
  10.  * 22.01.95: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "SVRFLSEL.C v1.00 - 03.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>                    /* header standard */
  22.     #include <string.h>                    /* header tt de chaines */
  23.     #include    <stdlib.h>                    /* Pour malloc etc.. */
  24.     #include <tos.h>
  25.  
  26. /*
  27.  * Custom headers:
  28.  */
  29.     #include "SPEC_PU.H"
  30.     #include "S_MALLOC.H"
  31.     #include "DEF_ARBO.H"
  32.     #include "DATPG_PU.H"
  33.     #include    "DEBUG_PU.H"    
  34.     #include    "SERV_PU.H"
  35.     #include    "LINE0_PU.H"
  36.     #include "GEMDIRPU.H"
  37.     #include "GENRC_PU.H"
  38.     #include "SERCOMPU.H"
  39.     #include    "IOFLD_PU.H"
  40.     #include "TEXT_PU.H"
  41.     #include    "FILES_PU.H"
  42.  
  43.  
  44. static    void    FileSel_ReadDir(
  45.                         VOIE    *    pVoie_curr );        /* In: Voie concern‚e */
  46.  
  47.  
  48. /*            
  49.  * --------------------------- METHODES -------------------------------
  50.  */
  51.  
  52.  
  53. /*
  54.  * FileSel_ENPG(-)
  55.  *
  56.  * Purpose:
  57.  * --------
  58.  * Traitrement des initialisations ENTER PAGE
  59.  *
  60.  * Suggest:
  61.  * --------
  62.  * Le read-dir ne devrait pas etre inclus ici
  63.  *
  64.  * History:
  65.  * --------
  66.  * 24.01.95: fplanque: Created
  67.  */
  68. void    FileSel_ENPG(
  69.             VOIE    *    pVoie_curr )        /* In: Voie concern‚e */
  70. {
  71.     PAGEARBO     *    pArboPg = pVoie_curr -> arboparams;
  72.     const char    *    cpsz_RootPath = pArboPg -> special_par.filesel -> pMsz_RootPath;
  73.     char            *    pMsz_SearchPath;
  74.  
  75.     /*
  76.      * Affiche donn‚es 
  77.      */
  78.     register_action( pVoie_curr, DDAT, 0, 0, NULL );
  79.      
  80.     /*
  81.      * Cr‚ation PATH courant:
  82.      */
  83.     free_String( pVoie_curr -> pMsz_Path );
  84.     pMsz_SearchPath = MALLOC( strlen( cpsz_RootPath ) + 15 );
  85.      strcpy( pMsz_SearchPath, cpsz_RootPath );
  86.      path_add_backslash( pMsz_SearchPath );
  87.      strcat( pMsz_SearchPath, "*.*" );
  88.     pVoie_curr -> pMsz_Path = pMsz_SearchPath;
  89.          
  90.     /*
  91.      * Lecture directory:
  92.      */
  93.     FileSel_ReadDir( pVoie_curr ); 
  94. }
  95.  
  96.  
  97.  
  98. /*
  99.  * FileSel_ReadDir(-)
  100.  *
  101.  * Purpose:
  102.  * --------
  103.  * Lecture du directory courant
  104.  *
  105.  * Notes:
  106.  * ------
  107.  * For direct call: create batches, Should not be batched
  108.  *
  109.  * History:
  110.  * --------
  111.  * 28.01.95: fplanque: Created
  112.  */
  113. void    FileSel_ReadDir(
  114.             VOIE    *    pVoie_curr )        /* In: Voie concern‚e */
  115. {
  116.     /*
  117.      * Efface eventuellement le directory d‚j… charg‚ en m‚moire:
  118.      */
  119.      Dir_Forget( pVoie_curr -> TpDirEnt, pVoie_curr -> nb_DirEnt );
  120.  
  121.     /*
  122.      * Charge nouveau dir:
  123.      */
  124.       pVoie_curr -> nb_DirEnt = Dir_Read( pVoie_curr -> pMsz_Path, &(pVoie_curr -> TpDirEnt), &(pVoie_curr -> nb_TableEnt) );
  125.     Dir_Sort( pVoie_curr -> TpDirEnt, pVoie_curr -> nb_DirEnt );
  126.  
  127.     /*
  128.      * Num‚ro de record en haut de l'‚cran:
  129.      * Num‚ro de record courant:
  130.      */
  131.     pVoie_curr -> n_RecIndex_Top = 1;
  132.     pVoie_curr -> n_RecIndex_Curr = 1;
  133.  
  134.     /*
  135.      * Demande l'affichage:
  136.      */
  137.     register_action( pVoie_curr, DREC, 0, 0, NULL );
  138.     register_action( pVoie_curr, DPAG, 0, 0, NULL );
  139. }
  140.  
  141.  
  142. /*
  143.  * FileSel_DispData(-)
  144.  *
  145.  * Purpose:
  146.  * --------
  147.  * Affiche les donn‚es initiales … l'‚cran:
  148.  *
  149.  * Notes:
  150.  * ------
  151.  * Ceci n'est normalement ‚x‚cut‚ qu'une seule fois … l'entr‚e de la page
  152.  *
  153.  * History:
  154.  * --------
  155.  * 24.03.95: fplanque: Created
  156.  * 28.03.95: n'affiche plus que le groupe 1
  157.  */
  158. void    FileSel_DispData(
  159.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  160. {
  161.     /*
  162.      * Affichage champs groupe 1 (commentaire...):
  163.      */
  164.     OutFields_DisplayGroup( pVoie_curr, 1, 0, 0 );
  165. }
  166.  
  167.  
  168. /*
  169.  * FileSel_DispRec(-)
  170.  *
  171.  * Purpose:
  172.  * --------
  173.  * Affiche les donn‚es concernat le dir courant
  174.  *
  175.  * Notes:
  176.  * ------
  177.  *
  178.  * History:
  179.  * --------
  180.  * 28.03.95: fplanque: Created
  181.  */
  182. void    FileSel_DispRec(
  183.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  184. {
  185.     /*
  186.      * Affichage champs groupe 2 (Path):
  187.      */
  188.     OutFields_DisplayGroup( pVoie_curr, 2, 0, 0 );
  189. }
  190.  
  191.  
  192.  
  193. /*
  194.  * FileSel_DispPage(-)
  195.  *
  196.  * Purpose:
  197.  * --------
  198.  * Affiche une page de liste
  199.  *
  200.  * History:
  201.  * --------
  202.  * 24.03.95: fplanque: Created
  203.  */
  204. void    FileSel_DispPage(
  205.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  206. {
  207.     ARBO_LISTPARS    * pArboListPars = pVoie_curr -> arboparams -> pArboListPars;    
  208.  
  209.     /*
  210.      * Compteurs de lignes:
  211.      */
  212.     int    n_Line;
  213.     /*
  214.      * Offsets d'affichage par rapport aux champs de r‚f‚rence
  215.      * du groupe 4:
  216.      */
  217.     int    n_YOffset = 0;
  218.  
  219.     for( n_Line = 1; 
  220.             n_Line <= pArboListPars -> nb_Lines;
  221.              n_Line++ )
  222.     {
  223.         if( pVoie_curr -> n_RecIndex_Curr > pVoie_curr -> nb_DirEnt )
  224.         {
  225.             return;
  226.         }
  227.  
  228.         /*
  229.          * Affichage des champs du groupe 4:
  230.          */
  231.         OutFields_DisplayGroup( pVoie_curr, 4, 0, n_YOffset );
  232.  
  233.         /*
  234.          * Prochain no de record:
  235.          */
  236.         (pVoie_curr -> n_RecIndex_Curr) ++;    /* + ou - Relatif au d‚but du groupe */
  237.         
  238.         /*
  239.          * Descend … l'‚cran:
  240.          */
  241.         n_YOffset += pArboListPars -> n_InterLine;
  242.     }
  243. }
  244.  
  245.  
  246. /*
  247.  * FileSel_ChgePage(-)
  248.  *
  249.  * Purpose:
  250.  * --------
  251.  * Changement de page dans la liste suite … pression sur SUITE ou RETOUR
  252.  *
  253.  * History:
  254.  * --------
  255.  * 26.03.95: fplanque: Created
  256.  */
  257. void    FileSel_ChgePage( 
  258.             VOIE    *    pVoie_curr,            /* In: Voie concern‚e */
  259.             KEYCODE    curr_keypress )    /* In: Touche press‚e */
  260. {
  261.     int    nb_DirEnt = pVoie_curr -> nb_DirEnt;
  262.     int    n_TopDirEnt = pVoie_curr -> n_RecIndex_Top;
  263.     ARBO_LISTPARS    * pArboListPars = pVoie_curr -> arboparams -> pArboListPars;    
  264.     int    nb_MaxDispLines = pArboListPars -> nb_Lines;
  265.  
  266.     if( nb_DirEnt == 0 )
  267.     {    /*
  268.          * S'il n'y a rien d'affich‚
  269.          * ... c'est qu'il n'y a rien … afficher!
  270.          */
  271.         aff_msg_l0( pVoie_curr, "Dossier Vide!" );
  272.         return;
  273.     }
  274.  
  275.     affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  276.  
  277.     if( curr_keypress == KEY_RETOUR )
  278.     {    /*
  279.          * Retour:
  280.          */
  281.         if( n_TopDirEnt <= 1 )
  282.         {
  283.             aff_msg_l0( pVoie_curr, "D‚but de liste!" );
  284.             return;
  285.         }
  286.  
  287.         n_TopDirEnt -= nb_MaxDispLines;
  288.         if( n_TopDirEnt < 1 )
  289.         {
  290.             n_TopDirEnt = 1;
  291.         }
  292.  
  293.         pVoie_curr -> n_RecIndex_Top    = n_TopDirEnt;
  294.         pVoie_curr -> n_RecIndex_Curr = n_TopDirEnt;
  295.         
  296.         /*
  297.          * Demande r‚affichage page:
  298.          */
  299.         Generic_DisplayPageChange( pVoie_curr );
  300.     }
  301.     else
  302.     {    /*
  303.          * Suite:
  304.          */    
  305.         if( n_TopDirEnt + nb_MaxDispLines > nb_DirEnt )
  306.         {
  307.             aff_msg_l0( pVoie_curr, "Fin de liste!" );
  308.             return;
  309.         }
  310.  
  311.         n_TopDirEnt += nb_MaxDispLines;
  312.  
  313.         pVoie_curr -> n_RecIndex_Top    = n_TopDirEnt;
  314.         pVoie_curr -> n_RecIndex_Curr = n_TopDirEnt;
  315.         
  316.         /*
  317.          * Demande r‚affichage page:
  318.          */
  319.         Generic_DisplayPageChange( pVoie_curr );
  320.     }
  321. }
  322.  
  323.  
  324. /*
  325.  * FileSel_KeyAction(-)
  326.  *
  327.  * Purpose:
  328.  * --------
  329.  * R‚agit … la touche press‚e sur une page de S‚lection de fichier
  330.  *
  331.  * History:
  332.  * --------
  333.  * 25.03.95: fplanque: Created
  334.  * 14.05.95: correction BUG: le realloc ne gardait pas la place du \0 final du path
  335.  * 14.05.95: efface no apres l'entr‚e dans un dossier
  336.  * 14.10.95: m‚morise nom de fichier selectionne
  337.  */
  338. void    FileSel_KeyAction( 
  339.             KEYCODE    curr_keypress, /* In: Touche press‚e */
  340.             VOIE    *    pVoie_curr )    /* In: Voie concern‚e */
  341. {
  342.     switch( curr_keypress )
  343.     {
  344.         case    KEY_RETOUR:
  345.         case    KEY_SUITE:
  346.             /*
  347.              * On veut changer de page:
  348.              */
  349.             FileSel_ChgePage( pVoie_curr, curr_keypress ); 
  350.             break;
  351.                     
  352.         case    KEY_ENVOI:                
  353.         {    /*
  354.               * Obtient ligne de commande:    
  355.               * (NE PAS MODIFIER la ligne de commande!)
  356.              */
  357.             const char * cpBsz_CmdLine = aim_CurrField( pVoie_curr );
  358.             
  359.             long    l_number;
  360.             
  361.             if( extract_number( cpBsz_CmdLine, &l_number ) )
  362.             {    /*
  363.                  * Demande d'ouverture:
  364.                  */
  365.                 DIRENTRY     * pDirEntry;
  366.                 const char    * cpsz_FileName; 
  367.                 char            * pisz;
  368.                 
  369.                 if( l_number < 1 || l_number > pVoie_curr -> nb_DirEnt ) 
  370.                 {
  371.                     aff_msg_l0( pVoie_curr, "Num‚ro de fichier incorrect!" );
  372.                     return;
  373.                 }
  374.                 
  375.                 pDirEntry = (pVoie_curr -> TpDirEnt)[ l_number-1 ];
  376.                 cpsz_FileName = pDirEntry -> sz_fname;
  377.  
  378.                 if( (pDirEntry -> uc_attrib) & FA_SUBDIR )
  379.                 {    /*
  380.                      * Il s'agit d'un sous dossier:
  381.                      */
  382.                     sprintf( G_tmp_buffer, "  Ouverture du dossier: %s", cpsz_FileName );
  383.                     add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  384.  
  385.                     /*
  386.                      * Cr‚ation du nouveau path:
  387.                      * 15: provisoire
  388.                      */                    
  389.                     pVoie_curr -> pMsz_Path = REALLOC( pVoie_curr -> pMsz_Path, strlen( pVoie_curr -> pMsz_Path ) + strlen( cpsz_FileName ) + 15 );
  390.  
  391.                     pisz = strBchr( pVoie_curr -> pMsz_Path, '\\' ); 
  392.                     if( pisz == NULL )
  393.                     {
  394.                         pisz = pVoie_curr -> pMsz_Path;
  395.                     }
  396.                     
  397.                     sprintf( pisz+1, "%s\\*.*", cpsz_FileName );
  398.                     
  399.                     /*
  400.                      * Affiche page de transition:
  401.                      */
  402.                     register_action( pVoie_curr, DISP, FE_CHGPAGE, 0, NULL );        /* Demande affichage page ‚cran */
  403.     
  404.                     /*
  405.                      * Lecture nouveau directory:
  406.                      */
  407.                     FileSel_ReadDir( pVoie_curr );
  408.                      
  409.                     /*
  410.                      * Efface le champ de saisie en question 
  411.                      * et se remet en attente pour une nouvelle saisie:
  412.                      */
  413.                     register_action( pVoie_curr, CLRF, 0, 0, pVoie_curr -> pIOField_CurrIn );        
  414.                     register_action( pVoie_curr, WAIT, 0, 0, NULL );        /* Repasse en mode d'attente d'action */
  415.                 
  416.                     return;
  417.                 }
  418.                             
  419.                 /*
  420.                  * On a tap‚ le no d'un fichier
  421.                  * C'est trŠs probablement pour le t‚l‚charger!
  422.                  * Compose nom du fichier et le m‚morise dans la variable appropri‚e
  423.                  */
  424.                 strcpy( G_tmp_buffer, pVoie_curr -> pMsz_Path );
  425.                 pisz = strBchr( G_tmp_buffer, '\\' ); 
  426.                 if( pisz )
  427.                 {
  428.                     pisz++;
  429.                 }
  430.                 else
  431.                 {
  432.                     pisz = G_2nd_buffer;
  433.                 }
  434.                 strcpy( pisz, cpsz_FileName );
  435.                 freeOld_dupString( &(pVoie_curr ->pMsz_VFile), G_tmp_buffer );
  436.                 
  437.                 sprintf( G_tmp_buffer, "   S‚lection du fichier: %s", pVoie_curr ->pMsz_VFile );
  438.                 add_textinf( pVoie_curr -> wi_params, G_tmp_buffer );
  439.                  
  440.                 /*
  441.                  * Demande Changement de page:
  442.                  */
  443.                 if( follow_ArboLink( pVoie_curr, FL_DOWNLOAD ) == TRUE_1 )
  444.                 {    /*
  445.                      * parametres pour la page arbo suivante:
  446.                      */
  447.                     /* pVoie_curr -> pDataPage_LockedDB_OUT = pVoie_curr -> database; */
  448.                 }
  449.                 return;
  450.             }
  451.  
  452.             /*
  453.              * On n'a pas tap‚ un nombre...
  454.              */
  455.             if( ! serv_handleKeyword( pVoie_curr, '\0' ) )
  456.             {    /*
  457.                  * Si pas de mot clef:
  458.                  */
  459.                 affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  460.  
  461.                 /*
  462.                  * Demande Changement de page:
  463.                  */
  464.                 follow_KeyArboLink( pVoie_curr, curr_keypress );
  465.             }
  466.             break;
  467.         }
  468.         
  469.         case    KEY_SOMM:
  470.         {
  471.             PAGEARBO     *    pArboPg = pVoie_curr -> arboparams;
  472.             const char    *    cpsz_RootPath = pArboPg -> special_par.filesel -> pMsz_RootPath;
  473.             char            *    pMsz_CurrPath = pVoie_curr -> pMsz_Path;
  474.             size_t             size_Root = strlen( cpsz_RootPath );
  475.             char            *    piBsz_EndSlash = strBchr( pMsz_CurrPath, '\\' );
  476.  
  477.             if( cpsz_RootPath[ size_Root-1 ] != '\\' )
  478.             {    /*
  479.                  * Si le rootpath ne se termine pas par \
  480.                  * sa vraie longueur est plus longue!
  481.                  */
  482.                 size_Root++;
  483.             }
  484.  
  485.             if( piBsz_EndSlash > &( pMsz_CurrPath[ size_Root-1 ] ) )
  486.             {    /*
  487.                  * On est dans un subdir par rapport … Root:
  488.                  * Vire le masque
  489.                  */
  490.                 *piBsz_EndSlash = '\0';
  491.                 /* 
  492.                  * Cherche
  493.                  */
  494.                 piBsz_EndSlash = strBchr( pMsz_CurrPath, '\\' );
  495.                 if( piBsz_EndSlash != NULL )
  496.                 {
  497.                     strcpy( piBsz_EndSlash+1, "*.*" );
  498.                     pVoie_curr -> pMsz_Path = REALLOC( pMsz_CurrPath, strlen( pMsz_CurrPath )+1 );
  499.  
  500.                     /*
  501.                      * Affiche page de transition:
  502.                      */
  503.                     register_action( pVoie_curr, DISP, FE_CHGPAGE, 0, NULL );        /* Demande affichage page ‚cran */
  504.  
  505.                     /*
  506.                      * Lecture nouveau directory:
  507.                      */
  508.                     FileSel_ReadDir( pVoie_curr );
  509.  
  510.                     register_action( pVoie_curr, CPOS, 0, 0, NULL );        /* Repositionne curseur pour continuer ‚dition */
  511.                     register_action( pVoie_curr, WAIT, 0, 0, NULL );        /* Repasse en mode d'attente d'action */
  512.  
  513.                     return;
  514.                 }
  515.             }
  516.                 
  517.             /*
  518.              * Si on ne peux pas remonter l'arbo, traite sommaire normalement
  519.              */
  520.         }    
  521.  
  522.  
  523.         case    KEY_ANNUL:
  524.         case    KEY_REPET:
  525.         case    KEY_GUIDE:
  526.         case    KEY_CORREC:
  527.             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  528.             /*
  529.              * Demande Changement de page:
  530.              */
  531.             follow_KeyArboLink( pVoie_curr, curr_keypress );
  532.             break;
  533.  
  534.     }
  535.  
  536. }
  537.  
  538.